package com.topgay.controller;

import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.topgay.domain.FriendList;
import com.topgay.domain.Member;
import com.topgay.domain.Message;
import com.topgay.service.FriendListService;
import com.topgay.service.MemberService;
import com.topgay.service.MessageService;

@Controller
// 경로명을 어떻게 통일할지 고민이 필요함!
@RequestMapping("/message/")
public class MessageController {

	@Autowired
	private MessageService service;

	@Autowired
	private MemberService memberService;
	
	@Autowired
	private FriendListService friendService;

	@RequestMapping("memberList.do")
	public ModelAndView memberList() throws Exception {
		List<Member> list = service.getMemberList();
		return new ModelAndView("popup/message/member_list.jsp", "member_list", list);
	}

	@RequestMapping("myInfo.do")
	public String myInfo(HttpSession session, HttpServletRequest request) {

		return "popup/message/mypage.jsp";
	}

	
	//여기를 통해 모든 사용자의 프로필 페이지가 보여질 것임. 
	//그래서 여기를 통해서 상대방의 프로필 페이지를 보여주기 전에 그 상대방의 아이디를 가지고 그 사람이 내 친구인지를 일단 디비에서 조회를 해서 그 결과값을 주소에 같이 넘겨줘야 할 필요가 있음
	//그래서 여기로 오는 모든 값은 내 아이디와 친구 아이디가 같이 와야 한다. 
	@RequestMapping("member_profile.do")
	public String memberProfile(String myId, @RequestParam(required=false)String friendId, @RequestParam(required=false)String friendNickname, HttpSession session) throws SQLException {
		Member member = null;
		if(friendId != null && friendId.trim().length() != 0){
			member = service.getMemberById(friendId);
		} else if(friendNickname != null && friendNickname.trim().length() != 0){//별명
//			member = service.getMemberByNickname(friendNickname);
//			friendId = member.getId();
			member = memberService.getMemberByNickname(friendNickname);
			if(member!=null){
				friendId = member.getId();
			}
		} else {
			System.out.println("[member_profile.do]friendId && friendNickname 모두 null");
			//friendId && friendNickname 모두 null
		}
		session.setAttribute("member_info", member);
		List<FriendList> fl = friendService.selectFriendList(myId);
		for(FriendList list : fl){
			if(list.getFriendId().equals(friendId)){
				//친구가 등록되어 있으면
				return "popup/message/profile.jsp?flag=0";
			}
		}
		//친구가 등록되어 있지 않으면 
		return "popup/message/profile.jsp?flag=1";
	}
	
	@RequestMapping("timeLineRequestSend.do")
	public ModelAndView timeLineRequestSend(HttpSession	session) throws SQLException {

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
		String days = dateFormat.format(Calendar.getInstance().getTime());
		String content = "Time Line Request";
		String title = ((Member)(session.getAttribute("login_info"))).getNickname()+"님 께서 TimeLine 요청을 하셨습니다.";

		Message message = new Message(((Member)(session.getAttribute("login_info"))).getId(), ((Member)(session.getAttribute("member_info"))).getId(), 
				content, days, title, 1);
		
		int check = service.timeLineRequestSend(message);
		
		List<FriendList> fl = friendService.selectFriendList(((Member)(session.getAttribute("login_info"))).getId());
		for(FriendList list: fl){
			if(list.getFriendId().equals(((Member)(session.getAttribute("member_info"))).getId())){
				
				return new ModelAndView("redirect:realSend.do?check_num="+check+"&flag=0");
			}
		}
		
		return new ModelAndView("redirect:realSend.do?check_num="+check+"&flag=1");
		
	}

	@RequestMapping("messageSend.do")
	public ModelAndView messageSend(String toId, String fromId, String content, String title, String myId, String friendId) throws SQLException {

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
		String days = dateFormat.format(Calendar.getInstance().getTime());

		Message message = new Message(fromId, toId, content, days, title);

		int check = service.messageSend(message);
		// 성공하면 리다이렉트 방식으로 다른 컨트롤러를 다시 부르고 그 컨트롤러가 profile을 부름
		//다시 프로필 페이지로 돌아가면서 반드시 내 친구인지 아닌지를 확인해서 그 플래그 값을 넘겨야 한다. 
		List<FriendList> fl = friendService.selectFriendList(myId);
		for(FriendList list: fl){
			if(list.getFriendId().equals(friendId)){
				
				return new ModelAndView("redirect:realSend.do?check_num="+check+"&flag=0");
			}
		}
		return new ModelAndView("redirect:realSend.do?check_num="+check+"&flag=1");
		
	}

	@RequestMapping("messageSend1.do")
	public ModelAndView messageSend1(String toId, String fromId, String content, String title, String days, String num)
			throws SQLException {

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
		String days1 = dateFormat.format(Calendar.getInstance().getTime());

		Message message = new Message(fromId, toId, content, days1, title);

		int check = service.messageSend(message);

		return new ModelAndView("redirect:realSend1.do?check_num=" + check + "&num=" + num + "&days=" + days1 + "&toId="
				+ toId + "&fromId=" + fromId + "&content=" + content + "&title=" + title);
	}

	@RequestMapping("realSend.do")
	public ModelAndView readSend(String check_num, int flag) {
		ModelAndView mv = new ModelAndView("popup/message/profile.jsp?flag="+flag, "check_num", check_num);
		return mv;
	}

	@RequestMapping("realSend1.do")
	public ModelAndView readSend1(String check_num, String num, String toId, String fromId, String title, String content,
			String days, ModelMap map) {

		int num1 = Integer.parseInt(num);

		Message message = new Message(num1, fromId, toId, content, days, title);

		map.addAttribute("message",message);

		ModelAndView mv = new ModelAndView("popup/message/message_content_send.jsp", "check_num", check_num);
		return mv;
	}

	// RequestParam 디폴트벨류라는 옵션값을 설정해주기 위해서 사용한거지 사실은 필요없다.
	@RequestMapping("messageBox.do")
	public String messageBox(@RequestParam(defaultValue = "1") String page, String id, ModelMap model) throws Exception {

		String url = null;

		int pageNo = 1;

		try {
			pageNo = Integer.parseInt(page);
		} catch (Exception e) {
		}

		// 이 맵에는 서비스에서 처리한 각종 값들이 맵 타입으로 리턴되는것!
		Map map = service.getMessageById(id, pageNo);

		// 이 모델은 값을 뷰로 넘길때 사용하는 것!
		model.addAllAttributes(map);

		url = "popup/message/messageBox.jsp";
		return url;
	}

	@RequestMapping("sendMessageBox.do")
	public String sendMessageBox(@RequestParam(defaultValue = "1") String page, String id, ModelMap model) throws Exception {

		String url = null;

		int pageNo = 1;

		try {
			pageNo = Integer.parseInt(page);
		} catch (Exception e) {
		}

		Map map = service.getSendMessageById(id, pageNo);

		model.addAllAttributes(map);

		url = "popup/message/send_message_box.jsp";
		return url;
	}

	@RequestMapping("getContent.do")
	public String getContent(int num, int flag, HttpServletResponse response, ModelMap map) {
		String url = null;
		
		try {
			Message message = service.getContentByNum(num);
			map.addAttribute("message", message);
			if(message.getFlag() == 1){
				return "body/chatting/request_timeline.jsp";
			}
			
			if(flag==0){
			url = "popup/message/message_content.jsp";
			}else if(flag==1){
				url = "popup/message/message_content_send.jsp";
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return url;
	}

	@RequestMapping("deleteMessage.do")
	public String deleteMessage(@RequestParam(defaultValue = "1")String page ,String id, int num, ModelMap map) {

		String url = null;
		try {
			service.deleteMessageByNum(num);
			url = "redirect:messageBox.do?id=" + id + "&page=" + page;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return url;
	}

}